package com.example.mybaseapp.ui.floatingview

import android.app.Service
import android.content.Intent
import android.graphics.PixelFormat
import android.os.Build
import android.os.IBinder
import android.view.Gravity
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.WindowManager
import android.widget.Button
import android.widget.Toast
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.example.mybaseapp.R
import com.example.mybaseapp.util.DisplayerUtil
import com.google.android.material.internal.ViewUtils.dpToPx

class FloatingFreeWindowService : Service() {
    private lateinit var localBroadcastManager: LocalBroadcastManager
    private lateinit var windowManager: WindowManager
    private lateinit var floatingView: View

    private var initialX = 0
    private var initialY = 0
    private var initialTouchX = 0f
    private var initialTouchY = 0f

    override fun onCreate() {
        super.onCreate()

        windowManager = getSystemService(WINDOW_SERVICE) as WindowManager
        localBroadcastManager = LocalBroadcastManager.getInstance(this)
        // Inflate the floating layout
        floatingView = LayoutInflater.from(this).inflate(R.layout.layout_floating_free_window, null)

        // 获取屏幕大小
        val displayMetrics = resources.displayMetrics
        val screenWidth = displayMetrics.widthPixels
        val screenHeight = displayMetrics.heightPixels

// 计算边界距离（假设为50dp）
        val marginDp = 30 // 边界距离（单位：dp）
        val marginPx = DisplayerUtil.dpToPx(this,marginDp) .toInt()// 将dp转换为像素

// 创建悬浮窗口的布局参数
        val layoutParams = WindowManager.LayoutParams(
            // 设置窗口大小（根据需要调整）
            WindowManager.LayoutParams.WRAP_CONTENT, // 高度可根据内容调整，宽度可以设置为一个固定值或者适配屏幕宽度的百分比减去两倍边界距离
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, // 设置窗口标志
            PixelFormat.TRANSLUCENT // 设置像素格式
        )

// 设置窗口类型（根据你的需求选择适当的类型）
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
        } else {
            layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE
        }

// 设置窗口的位置和大小（考虑到边界距离）
        layoutParams.gravity = Gravity.TOP or Gravity.START or Gravity.CENTER_HORIZONTAL // 根据需要调整重力属性以保持居中水平，并添加顶部和开始位置的重力属性来调整垂直位置
        layoutParams.x = marginPx // 设置水平位置（考虑边界距离）
        layoutParams.y = marginPx // 设置垂直位置（考虑边界距离）
        layoutParams.width = screenWidth - 2*marginPx // 考虑边界距离的宽度值，这里使用屏幕宽度减去两倍的边界距离来保持居中显示（视需求而定）
        layoutParams.height = screenHeight - 2*marginPx // 设置所需的高度值

        // Add the view to the window
        windowManager.addView(floatingView, layoutParams)

        // Set button click listener
        val button: Button = floatingView.findViewById(R.id.floating_button)
        button.setOnClickListener {
            // Handle button click
            // You can add your desired action here
//            Toast.makeText(this, "这是一个悬浮窗",Toast.LENGTH_SHORT).show()
            // 启动原来的活动（如果存在，则将其置于前面）

//            localBroadcastManager.sendBroadcast(Intent("com.example.floating.localreceiver"))//使用本地广播来启动原来的界面；
            //            因为这个是在原来的界面，启动的时候就会多出一个FloatintViewActivity；应该是可以解决的
            val activityIntent = Intent(this, FloatintViewActivity::class.java)
            activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
            startActivity(activityIntent)
            stopSelf()
        }

        // Close the service when the floating view is clicked
//        floatingView.setOnClickListener {
//            stopSelf()
//        }

        // 设置触摸监听
        floatingView.setOnTouchListener { v, event ->
            when (event.action) {
                MotionEvent.ACTION_DOWN -> {
                    initialX = layoutParams.x
                    initialY = layoutParams.y
                    initialTouchX = event.rawX
                    initialTouchY = event.rawY
                    true
                }
                MotionEvent.ACTION_MOVE -> {
                    layoutParams.x = initialX + (event.rawX - initialTouchX).toInt()
                    layoutParams.y = initialY + (event.rawY - initialTouchY).toInt()
                    windowManager.updateViewLayout(floatingView, layoutParams)
                    true
                }
                else -> false
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        if (::floatingView.isInitialized) {
            windowManager.removeView(floatingView)
        }
    }

    override fun onBind(intent: Intent?): IBinder? {
        return null
    }
}